home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / datelib.exe / READDATE.C < prev    next >
C/C++ Source or Header  |  1992-03-27  |  11KB  |  285 lines

  1. static char readdate_prog[] = "@(#)char *readdate(int f, char *dstr) - Datum einlesen";
  2. static char readdate_ver[]  = "@(#)v1.10/kr ; 21.07.91";
  3. /* readdate         Einlesen eines Datum-String
  4. **
  5. ** Autor            Klaus Rath
  6. **
  7. ** Deklaration      char *readdate(int format, char *datestring);
  8. **
  9. ** Compilation      DOS:  bcc -c readdate.c c:\usr\local\lib\libkrc_s.lib
  10. **                  UNIX: cc  -c readdate.c /u1/usr/lib/libkrc.a
  11. **                  ( unter DOS kann die Funktion im small-Modell laufen )
  12. **
  13. ** Übergabe         Die Funktion erwartet einen Integer, der angibt in wel-
  14. **                  chem Format eingelesen werden soll.
  15. **                  Z.Zt. erlaubte Formate (siehe datum.h) :
  16. **                  tt.mm.[jj]jj     -- Deutsches Format       (format: 1,2)
  17. **                  mm/tt/[jj]jj     -- Amerikanisches Format  (format: 3,4)
  18. **                  [jj]jjmmtt       -- Datenbankformat DDB/4  (format: 5,6)
  19. **                  tt.mm. | mm/tt   -- Kurzformat deutsch/am. (format: 7,8).
  20. **                  Außerdem wird ein Zeiger auf ein char-Array zur Aufnahme
  21. **                  des Ergebnisses erwartet.
  22. **
  23. ** Rückgabe         (char *) auf datestring
  24. **
  25. ** Anmerkungen      Die Funktion prüft nicht die Validität des eingegebenen
  26. **                  Datums - dies sollte die aufrufende Funktion selbst tun,
  27. **                  bzw. den Test durch checkdate() durchführen lassen.
  28. **                  Die Funktion benutzt zum Einlesen eine Funktion
  29. **                  int editgetch(int form), die einen Tastendruck entsprechend
  30. **                  dem übergebenen Format form bewertet. Z.Zt. sind folgende
  31. **                  Formate implementiert ( s. util.h ) :
  32. **                  ALL    (1) - Alle Character 0 - 255
  33. **                  UPPER  (2) - Buchstaben werden in GROSS konvertiert
  34. **                  LOWER  (3) - Buchstaben werden in klein konvertiert
  35. **                  NUM    (4) - Zahlen, '.', ',', '+', '-'
  36. **                  DATUM  (5) - Zahlen, '.', '/', '-'
  37. **                  ZEIT   (6) - Zahlen, '.', ':'
  38. **                  readdate() stellt dem Aufrufer eine Maske des angeforder-
  39. **                  ten Format zur Verfügung ( z.B. __.__.__ ), wobei die
  40. **                  Unterstriche durch Zahlen gefüllt werden müssen. Die
  41. **                  u.U. nötigen Trennzeichen sind im Gegensatz zu den Zahlen
  42. **                  nicht editierbar und werden automatisch erzeugt. Eine
  43. **                  Korrektur der Zahlen ist über die BACKSPACE-Taste möglich.
  44. **                  Die Eingabe von RETURN oder ESCAPE beendet die Eingabe
  45. **                  immer, hinter der letzten Position genügt ein beliebige
  46. **                  Tastendruck dafür - außer BACKSPACE, wg. Korrektur.
  47. **
  48. ** Änderungen       1.00 ; 09.06.91
  49. **                  - Erste Version
  50. **                  1.20 ; 21.07.91
  51. **                  - Fehler im Korrekturteil beseitigt.
  52. **                  - Variable int trenner = '.'||'/' eingefügt.
  53. **                  - Berücksichtigung eines evtl. bereits eingegebenen
  54. **                    ersten Zeichens (dazu Variable: int def_char).
  55. **                  - Taste ESC (27) gibt jetzt einen NULL-Zeiger zurück
  56. **                    ( tatsächlicher Abbruch !), während RETURN weiterhin
  57. **                    den vorbelegten bzw. (teil-)ausgefüllten String liefert.
  58. */
  59.  
  60. #include <stdio.h>
  61. #include <string.h>
  62. #ifdef __TURBOC__
  63. #define ANSI
  64. #define KR_SYS
  65. #include <stdlib.h>
  66. #include "datum.h"
  67. #include "util.h"
  68. #else
  69. #include "/u1/usr/include/datum.h"
  70. #include "/u1/usr/include/util.h"
  71. #endif
  72.  
  73. #ifdef ANSI
  74. char *readdate(int format, char *dstring)
  75. #else
  76. char *readdate(format,dstring)
  77. int  format;
  78. char *dstring;
  79. #endif
  80. {
  81.     /* Variablendefinitionen :
  82.     */
  83.     int trennpos1 = 2,                       /* Positionen von Trennzeichen */
  84.         trennpos2 = 5;
  85.     int trenner;                             /* Trennzeichen                */
  86.     int pos       = 0;                       /* Aktuelle Position           */
  87.     int maxpos    = 11;                      /* Letztmögliche Position      */
  88.     int max       = 0;                       /* Schalter, ob am Ende        */
  89.     int ch;                                  /* Einzulesendes Zeichen       */
  90.     int def_char  = '_';                     /* Vorbelegungszeichen         */
  91.  
  92.     /* Berücksichtigung eines bereits vorhandenen 1. Zeichens in dstring :
  93.     */
  94.     if ( dstring[0] == '\0' ) {
  95.         dstring[0] = def_char;
  96.     }
  97.     else {
  98.         pos    = 1;
  99.     }
  100.  
  101.  
  102.     /* Format überprüfen, String vorbelegen, Anzeigemaske erzeugen :
  103.     */
  104.     switch ( format ) {
  105.         case DE_KURZ :
  106.                  trenner   = 46;
  107.                  maxpos    = 9;
  108.                  dstring[trennpos1] =
  109.                  dstring[trennpos2] = trenner;
  110.                  printf("%c_.__.__",dstring[0]);
  111.                  printf("\b\b\b\b\b\b\b");
  112.                  break;
  113.         case DE_LANG :
  114.                  trenner   = 46;
  115.                  maxpos    = 11;
  116.                  dstring[trennpos1] =
  117.                  dstring[trennpos2] = trenner;
  118.                  printf("%c_.__.____",dstring[0]);
  119.                  printf("\b\b\b\b\b\b\b\b\b");
  120.                  break;
  121.         case AM_KURZ :
  122.                  trenner   = 47;
  123.                  maxpos    = 9;
  124.                  dstring[trennpos1] =
  125.                  dstring[trennpos2] = trenner;
  126.                  printf("%c_/__/__",dstring[0]);
  127.                  printf("\b\b\b\b\b\b\b");
  128.                  break;
  129.         case AM_LANG :
  130.                  trenner   = 47;
  131.                  maxpos    = 11;
  132.                  dstring[trennpos1] =
  133.                  dstring[trennpos2] = trenner;
  134.                  printf("%c_/__/____",dstring[0]);
  135.                  printf("\b\b\b\b\b\b\b\b\b");
  136.                  break;
  137.         case DB_KURZ :
  138.                  maxpos    = 7;
  139.                  trennpos1 =
  140.                  trennpos2 = 99;
  141.                  printf("%c_____",dstring[0]);
  142.                  printf("\b\b\b\b\b");
  143.                  break;
  144.         case DB_LANG :
  145.                  maxpos    = 9;
  146.                  trennpos1 =
  147.                  trennpos2 = 99;
  148.                  printf("%c_______",dstring[0]);
  149.                  printf("\b\b\b\b\b\b\b");
  150.                  break;
  151.         case DE_AKTJAHR :
  152.                  trenner   = 46;
  153.                  maxpos    = 7;
  154.                  dstring[trennpos1] =
  155.                  dstring[trennpos2] = trenner;
  156.                  printf("%c_.__.",dstring[0]);
  157.                  printf("\b\b\b\b\b");
  158.                  break;
  159.         case AM_AKTJAHR :
  160.                  trenner   = 47;
  161.                  maxpos    = 6;
  162.                  dstring[trennpos1] = trenner;
  163.                  trennpos2 = 99;
  164.                  printf("%c_/__",dstring[0]);
  165.                  printf("\b\b\b\b");
  166.                  break;
  167.         default:
  168.                  trenner   = 46;
  169.                  maxpos    = 9;
  170.                  dstring[trennpos1] =
  171.                  dstring[trennpos2] = trenner;
  172.     } /* ENDE: switch(format) */
  173.  
  174.     /* Evtl. noch ein BACKSPACE ausführen :
  175.     */
  176.     if ( !pos ) {
  177.         printf("\b");
  178.     }
  179.  
  180.     /* Tastendrucke abholen, bis maxpos :
  181.     */
  182.     while ( pos < maxpos + 1 ) {
  183.  
  184.         /* Falls fertig, String zurückgeben :
  185.         */
  186.         if ( pos == maxpos ) {
  187.             dstring[pos] = '\0';
  188.             return(dstring);
  189.         }
  190.         /* An eventuellen Trennerpositionen den passenden Trenner einfügen
  191.         ** und den nächsten Schleifendurchlauf abwarten :
  192.         */
  193.         if ( pos == trennpos1 || pos == trennpos2 ) {
  194.             printf("%c",dstring[trennpos1]);
  195.             pos++;
  196.             continue;
  197.         }
  198.  
  199.         /* An der vorletzten Position sind alle Tasten erlaubt, denn nur
  200.         ** BACKSPACE bleibt in der Funktion :
  201.         */
  202.         if ( pos == maxpos - 1 ) {
  203.             max = 1;
  204.             ch  = editgetch(ALL);
  205.         } /* pos < maxpos -1 */
  206.         else
  207.             ch  = editgetch(DATUM);
  208.  
  209.         /* Auswertung der gedrückten Taste :